// 40. 组合总和 II



function combinationSum2(candidates: number[], target: number): number[][] {
    let ans:number[][] = []
    candidates.sort((a,b)=>{
        return a - b
    })


    /**
     * 
     * @param start 
     * @param target 
     * @param tmp 
     * @param canSame 用来进行去重操作 => 重复发生的条件是   当上一个元素和这个相同的时候,上一个存在两种情况
     *          加入 和 不加入  当不加入的时候,相同元素再加入就会导致重复 
     */
    function search(start: number,target: number,tmp: number[],canSame:boolean){
        if(start>=candidates.length||target<0) return
        if(candidates[start]==target){
            let t :number[] = JSON.parse(JSON.stringify(tmp))
            t.push(candidates[start])
            ans.push(t)
            return
        }   
        if(canSame||(start==0||candidates[start]!=candidates[start-1])){
            tmp.push(candidates[start])
             search(start+1,target-candidates[start],tmp,true)
            tmp.pop()

        }
        search(start+1,target,tmp,false)

    }
    search(0,target,[],true)
    return ans
};

// let candidates = [10,1,2,7,6,1,5], target = 8
// const ans2 = combinationSum2(candidates,target)
// console.log(ans2)